Various types of development applications exist that software developers may use to develop software. An integrated development environment (IDE) is a type of software development application that contains several development tools in one package. An IDE may include tools such as a source code editor, a build automation tool, and a debugger. Examples of IDEs include Eclipse™ developed by Eclipse Foundation of Ottawa, Canada, ActiveState Komodo™ developed by ActiveState of Vancouver, Canada, IntelliJ IDEA developed by JetBrains of the Czech Republic, Oracle JDeveloper™ developed by Oracle Corporation of Redwood City, Calif., NetBeans developed by Oracle Corporation, Codenvy™ developed by Codenvy of San Francisco, Calif., Xcode® developed by Apple Corporation of Cupertino, Calif., and Microsoft® Visual Studio®, developed by Microsoft Corporation of Redmond, Wash.
Edit-and-Continue is a time saving feature built into some IDE tools, such as Microsoft® Visual Studio® Debugger. Edit-and-Continue allows a user to make source code edits while in a live debugging context. Edit-and-Continue is very useful in the development of many types of applications, including the development of video games, where developers may generate optimized builds in daily use (primarily for performance reasons).
It is extremely difficult to enable Edit-and-Continue for native code (e.g., C/C++) and IDE's tend to stay away from Edit-and-Continue for native code today because the user experience is very poor. An optimized build results in machine code that is semantically equivalent to machine code generated without optimizations, but is configured in a way that fewer resources are used during execution of the optimized machine code (e.g., less memory, fewer procedure calls, etc.). Enabling edit-and-continue is extremely challenging for optimized code. For native optimized code, it is extremely difficult to co-relate the instructions generated in the optimized machine code binary with the instructions in the application source code. This is primarily due to the many types of optimizations that may be performed (e.g., inlining, register allocation, Common Subexpression elimination etc.).
Many developers also use optimized build configurations for their daily developer build scenarios. This is a very common practice for game developers, who need the game to run at a particular speed to add visual effects, etc. Due to some of the optimizations mentioned above, it is common for a developer that is debugging optimized code to observe a hopping program counter (the program counter jumps around in a manner that is not sequential), cross-jumping, and the well-known roving variable phenomenon (e.g., a variable might be dead and its register is reused, assignment to a variable has been moved etc.), which make debugging the optimized code difficult to understand for the average developer. This also leads to Edit-and-Continue not being operational for optimized code.